home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Misc / Capture / Source / Grab20.m < prev    next >
Text File  |  1995-06-12  |  8KB  |  350 lines

  1. // You may freely copy, distribute and reuse the code in this example.
  2. // The author disclaims any warranty of any kind, expressed or implied,
  3. // as to its fitness for any particular use.
  4.  
  5. // Grab20 and Capture written by Peter Eisch.
  6.  
  7. /* Generated by Interface Builder */
  8.  
  9. #import "Grab20.h"
  10. #import "other.h"
  11. #import <appkit/Application.h>
  12. #import <appkit/Button.h>
  13. #import <appkit/Listener.h>
  14. #import <appkit/Speaker.h>
  15. #import <appkit/SavePanel.h>
  16. #import <appkit/Slider.h>
  17. #import <appkit/graphics.h>
  18. #import <appkit/nextstd.h>
  19. #import <dpsclient/wraps.h>
  20. #import <objc/List.h>
  21. #import <streams/streams.h>
  22. #import <sys/timeb.h>
  23. #import <appkit/Panel.h>
  24. #import <defaults/defaults.h>
  25.  
  26. @implementation Grab20
  27.  
  28. - drawSelf:(const NXRect *)rects :(int)count
  29. {
  30.     [super drawSelf:rects :count];
  31.     NXSetColor(NX_COLORRED);
  32.     PSrectstroke(grabRect.origin.x,
  33.             grabRect.origin.y,
  34.             grabRect.size.width,
  35.             grabRect.size.height);
  36.     return self;
  37. }
  38.  
  39. - setCount:sender
  40. {
  41.     [field setIntValue:[frameSlider intValue]];
  42.     return self;
  43. }
  44.  
  45. - begin:sender
  46. {
  47.     int i;
  48.     NXRect region, area;
  49.     time_t myTime;
  50.     id list, spanel;
  51.     char tmp[255];
  52.  
  53.     int count = [frameSlider intValue];
  54.     int imageWidth = [width intValue];
  55.     int imageHeight = [height intValue];
  56.     int originx = [x intValue];
  57.     int originy = [y intValue];
  58.  
  59.     [startGrab setStringValue:""];
  60.     [stopGrab setStringValue:""];
  61.     [startWrite setStringValue:""];
  62.     [stopWrite setStringValue:""];
  63.     
  64.     if ((imageWidth <= 0) || (imageHeight <= 0)) {
  65.         NXRunAlertPanel("No Region",
  66.                 "You need to select a region to grab.",
  67.                 NULL,NULL,NULL);
  68.         return self;
  69.     }
  70.     
  71.     list = [[List alloc] initCount:count];
  72.     
  73.     region.size.width = imageWidth;
  74.     region.size.height = imageHeight;
  75.     region.origin.x = 0.0;
  76.     region.origin.y = 0.0;
  77.  
  78.     area.size.width = region.size.width;
  79.     area.size.height = region.size.height;
  80.     area.origin.x = originx;
  81.     area.origin.y = originy;
  82.     
  83.     for (i = 0; i < count; i++) {
  84.         [list addObject:[[NXImage alloc] initSize:®ion.size]];
  85.     }
  86.     
  87.     [startGrab setStringValue:"Building Speed Cache"];
  88.  
  89.     for (i = 0; i < count; i++) {
  90.         id image = [list objectAt:i];
  91.         if ([image lockFocus])
  92.             [image unlockFocus];
  93.         else NXLogError("problem locking focus on %i\n", i);
  94.     }
  95.     
  96.     myTime = time(0);
  97.     sprintf(tmp, "%s", ctime(&myTime));
  98.     [startGrab setStringValue:tmp];
  99.  
  100.     for (i = 0; i < count; i++) {
  101.         [self grabIn:[list objectAt:i] fromRect:&area toRect:®ion];
  102.     }
  103.  
  104.     myTime = time(0);
  105.     sprintf(tmp, "%s", ctime(&myTime));
  106.     [stopGrab setStringValue:tmp];
  107.  
  108.     spanel = [SavePanel new];
  109.     [spanel setRequiredFileType:"anim"];
  110.     if ([spanel runModal]) {
  111.         char * path;
  112.         char dir[255];
  113.         char file[255];
  114.         char tmpdir[255];
  115.         char tmpname[255];
  116.         
  117.         path = (char *)[spanel filename];        
  118.         sprintf(tmpdir,"/bin/mkdir %s\n", path);
  119.         system(tmpdir);
  120.  
  121.         parsePath(path, dir, file);
  122.         sprintf(tmpdir, "%s/%s", path, file);
  123.  
  124.         myTime = time(0);
  125.         sprintf(tmp, "%s", ctime(&myTime));
  126.         [startWrite setStringValue:tmp];
  127.  
  128.         for (i = 0; i < count; i++) {
  129.             NXStream * data;
  130.             
  131.             data = NXOpenMemory(NULL, 0, NX_READWRITE);
  132.             sprintf(tmpname, "%s.%d.tiff", tmpdir, (i+1));
  133.             [[list objectAt:i] writeTIFF:data];            
  134.             NXSeek(data, 0, NX_FROMSTART);
  135.             NXSaveToFile(data, tmpname);
  136.             NXCloseMemory(data, NX_FREEBUFFER);
  137.         }
  138.         myTime = time(0);
  139.         sprintf(tmp, "%s", ctime(&myTime));
  140.         [stopWrite setStringValue:tmp];
  141.  
  142.         if ([open state]) {
  143.             int ok;
  144.             
  145.             [[NXApp appSpeaker] setSendPort:NXPortFromName(NX_WORKSPACEREQUEST, NULL)];
  146.             [[NXApp appSpeaker] openFile:[spanel filename] ok:&ok];
  147.     
  148.             if (!ok) {
  149.                     NXRunAlertPanel(NULL, "Couldn't open %s", NULL, NULL, NULL, [spanel filename]);
  150.             }
  151.         }
  152.     
  153.     }
  154.         
  155.     [list freeObjects];
  156.     [list free];
  157.     
  158.     return self;
  159. }
  160.  
  161. - appDidInit:sender
  162. {
  163.     [self start:self];
  164.     [self display];
  165.     return self;
  166. }
  167.  
  168. - appDidBecomeActive:sender
  169. {
  170.     [self start:self];
  171.     [self display];
  172.     return self;
  173. }
  174.  
  175. + initialize /* save compile and test it.  make sure the NXReadDefault() stuff is correct.  document the code */
  176. {
  177.     const NXDefaultsVector CaptureDefaults = {
  178.             { MAX_X, "590" },
  179.             { MAX_Y, "492" },
  180.             { MAX_WIDTH, "640"},
  181.             { MAX_HEIGHT, "480" },
  182.             { NULL, NULL }
  183.     };
  184.  
  185.     NXRegisterDefaults([NXApp appName], CaptureDefaults);
  186.  
  187.     return self;
  188. }
  189.  
  190. - update:sender
  191. {
  192.     int maxX = atoi(NXReadDefault([NXApp appName], MAX_X));
  193.     int maxY = atoi(NXReadDefault([NXApp appName], MAX_Y));
  194.     int maxWid = atoi(NXReadDefault([NXApp appName], MAX_WIDTH));
  195.     int maxHei = atoi(NXReadDefault([NXApp appName], MAX_HEIGHT));
  196.     int val = [sender intValue];
  197.     int tg = [sender tag];
  198.  
  199.     switch(tg) {
  200.         case 0:
  201.             if (val > maxWid) val = maxWid;
  202.             if (val < 0) val = 0;
  203.             break;
  204.         case 1:
  205.             if (val > maxHei) val = maxHei;
  206.             if (val < 0) val = 0;
  207.             break;
  208.         case 2:
  209.             if (val > maxX) val = maxX;
  210.             if (val < 0) val = 0;
  211.             break;
  212.         case 3:
  213.             if (val > maxY) val = maxY;
  214.             if (val < 0) val = 0;
  215.             break;
  216.     }
  217.     [sender setIntValue:val];
  218.     if ([x intValue] < 0) [x setIntValue:0];
  219.     if ([x intValue] > maxWid) [x setIntValue:maxWid];
  220.     if ([y intValue] < 0) [y setIntValue:0];
  221.     if ([y intValue] > maxHei) [y setIntValue:maxHei];
  222.     if ([width intValue] > (maxWid - [x intValue])) 
  223.         [width setIntValue:(maxWid - [x intValue])];
  224.     if ([height intValue] > (maxHei - [y intValue])) 
  225.         [height setIntValue:(maxHei - [y intValue])];
  226.     
  227.     [horiSlide setIntValue:[y intValue]];
  228.     [vertSlide setIntValue:[x intValue]];
  229.     [widSlide setIntValue:[width intValue]];
  230.     [heiSlide setIntValue:[height intValue]];
  231.     
  232.     NXSetRect(&grabRect,
  233.         [x floatValue], [y floatValue],
  234.         [width floatValue], [height floatValue]);
  235.         
  236.     [self display];
  237.     return self;
  238. }
  239.  
  240. - mouseDown:(NXEvent *)theEvent
  241. {
  242.   NXEvent anEvent = *theEvent;
  243.   NXPoint point1 = theEvent->location,point2;
  244.   int oldMask;
  245.   BOOL dragged = NO;
  246.   
  247.     [self convertPoint:&point1 fromView:nil];
  248.   oldMask = [window addToEventMask:NX_LMOUSEDRAGGEDMASK];
  249.     while(anEvent.type != NX_MOUSEUP) {
  250.         NXGetOrPeekEvent(DPSGetCurrentContext(),
  251.             &anEvent, NX_MOUSEUPMASK|NX_LMOUSEDRAGGEDMASK,NX_FOREVER,10,0);
  252.         if (anEvent.type == NX_MOUSEDRAGGED) {
  253.             dragged = YES;
  254.             point2 = anEvent.location;
  255.             [self convertPoint:&point2 fromView:nil];
  256.             if (point1.x < point2.x) {
  257.                 grabRect.origin.x = point1.x;
  258.                 grabRect.size.width = point2.x - point1.x;
  259.             } else {
  260.                 grabRect.origin.x = point2.x;
  261.                 grabRect.size.width = point1.x - point2.x;
  262.             }
  263.             if (point1.y < point2.y) {
  264.                 grabRect.origin.y = point1.y;
  265.                 grabRect.size.height = point2.y - point1.y;
  266.             } else {
  267.                 grabRect.origin.y = point2.y;
  268.                 grabRect.size.height = point1.y - point2.y;
  269.             }
  270.  
  271.             NXIntersectionRect(&bounds, &grabRect);
  272.             [x setIntValue:(int)grabRect.origin.x];
  273.             [y setIntValue:(int)grabRect.origin.y];
  274.             [width setIntValue:(int)grabRect.size.width];
  275.             [height setIntValue:(int)grabRect.size.height];
  276.             [self display];
  277.         }
  278.     }
  279.     if(!dragged) NXSetRect(&grabRect,0.0,0.0,0.0,0.0);
  280.     [horiSlide setIntValue:(int)grabRect.origin.x];
  281.     [vertSlide setIntValue:(int)grabRect.origin.y];
  282.     [widSlide setIntValue:(int)grabRect.size.width];
  283.     [heiSlide setIntValue:(int)grabRect.size.height];
  284.     [x setIntValue:[horiSlide intValue]];
  285.     [y setIntValue:[vertSlide intValue]];
  286.     [width setIntValue:[widSlide intValue]];
  287.     [height setIntValue:[heiSlide intValue]];
  288.     [self display];
  289.  
  290.   [window setEventMask:oldMask];
  291.   return self;
  292. }
  293.  
  294. - updateHori:sender
  295. {
  296.     [x setIntValue:[sender intValue]];
  297.     grabRect.origin.x = [sender floatValue];
  298.     [self display];
  299.     return self;
  300. }
  301.  
  302. - updateVert:sender
  303. {
  304.     [y setIntValue:[sender intValue]];
  305.     grabRect.origin.y = [sender floatValue];
  306.     [self display];
  307.     return self;
  308. }
  309.  
  310. - updateWid:sender
  311. {
  312.     [width setIntValue:[sender intValue]];
  313.     grabRect.size.width = [sender floatValue];
  314.     [self display];
  315.     return self;
  316. }
  317.  
  318. - updateHei:sender
  319. {
  320.     [height setIntValue:[sender intValue]];
  321.     grabRect.size.height = [sender floatValue];
  322.     [self display];
  323.     return self;
  324. }
  325.  
  326. - windowWillResize:sender toSize:(NXSize *)frameSize
  327. {
  328.     if (frameSize->width > 661) frameSize->width = 661;
  329.     if (frameSize->height > 531) frameSize->height = 531;    
  330.     return self;
  331. }
  332.  
  333. - changeIn:sender
  334. /* 
  335.  *  to set the video in
  336.  */
  337. {
  338.     [self selectInput:([[in selectedCell] tag] + 1)];
  339.     return self;
  340. }
  341.  
  342. - initFrame:(const NXRect *)dRect
  343. {
  344.     [super initFrame:dRect];
  345.     NXSetRect(&grabRect, 296.0, 216.0, 48.0, 48.0);
  346.     return self;
  347. }
  348.  
  349. @end
  350.